package com.aididi.sort;

/**
 * @Auther: xuzexiang
 * @Date: 2018-10-29 0029 11:54
 * @Description:    冒泡排序
 *
 */
public class MaoPaoDemo {

    public static void main(String[] args) {
        /**
         * 冒泡排序
         * 比较相邻的元素。如果第一个比第二个大，就交换他们两个。
         * 对每一对相邻元素作同样的工作，从开始第一对到结尾的最后一对。在这一点，最后的元素应该会是最大的数。
         * 针对所有的元素重复以上的步骤，除了最后一个。
         * 持续每次对越来越少的元素重复上面的步骤，直到没有任何一对数字需要比较。
         * @param numbers 需要排序的整型数组
         */
        int[] numbers = {10,20,15,0,6,7,2,1,-5,55};
           /* int temp = 0;
        for(int i=0;i<numbers.length-1;i++){
            for(int j=0;i<numbers.length-1-i;j++){
                //交换两数位置
                if(numbers[j] > numbers[j+1]){
                    temp = numbers[j];
                    numbers[j]=numbers[j+1];
                    numbers[j+1] = temp;
                }
            }
        }*/
        System.out.print("排序前：");
        printArr(numbers);
        bubbleSort(numbers);
        System.out.print("冒泡排序后：");
        printArr(numbers);
    }

    public static void bubbleSort(int[] numbers)
    {
        int temp = 0;
        int size = numbers.length;
        for(int i = 0 ; i < size-1; i ++)
        {
            for(int j = 0 ;j < size-1-i ; j++)
            {
                //交换两数位置
                if(numbers[j] > numbers[j+1])
                {
                    temp = numbers[j];
                    numbers[j] = numbers[j+1];
                    numbers[j+1] = temp;
                }
            }
        }
    }

    /**
     * 打印函数：
     * @param numbers
     */
    public static void printArr(int[] numbers)
    {
        for(int i = 0 ; i < numbers.length ; i ++ )
        {
            System.out.print(numbers[i] + ",");
        }
        System.out.println("");
    }

    /**
     *      改进后的算法
     * @param r
     * @param n
     */
    public static void Bubble_1 ( int r[], int n) {
        //初始时,最后位置保持不变
        int i= n -1;
        while ( i> 0) {
            //每趟开始时,无记录交换
            int pos= 0;
            for (int j= 0; j< i; j++)
                if (r[j]> r[j+1]) {
                    //记录交换的位置
                    pos= j;
                    int tmp = r[j]; r[j]=r[j+1];r[j+1]=tmp;
                }
            //为下一趟排序作准备
            i= pos;
        }
    }


}

